package pers.cz.javacvdemo.oss.service;

import org.springframework.beans.factory.InitializingBean;
import software.amazon.awssdk.services.s3.model.Bucket;

import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 文件操作模板
 *
 * @author lengleng
 * @date 2022/4/19
 */
public interface FileTemplate extends InitializingBean {
	/**
	 * 创建bucket
	 * @param bucketName bucket名称
	 */
	void createBucket(String bucketName);

	/**
	 * 获取全部bucket
	 * <p>
	 *
	 * API Documentation</a>
	 */
	List<Bucket> getAllBuckets();

	/**
	 * @param bucketName bucket名称
	 * @see <a href= Documentation</a>
	 */
	void removeBucket(String bucketName);

	/**
	 * 上传文件
	 * @param bucketName bucket名称
	 * @param objectName 文件名称
	 * @param stream 文件流
	 * @param contextType 文件类型
	 * @throws Exception
	 */
	void putObject(String bucketName, String objectName, InputStream stream, String contextType) throws Exception;

	void putFilesAndDeleteSource(String bucketName, Collection<File> files);

	/**
	 * 上传文件
	 * @param bucketName bucket名称
	 * @param objectName 文件名称
	 * @param stream 文件流
	 * @throws Exception
	 */
	void putObject(String bucketName, String objectName, InputStream stream) throws Exception;

	/**
	 * 持久化一个对象
	 * @param serializable
	 * @param fileName
	 */
	void putObject(Serializable serializable, String fileName);

	/**
	 * 获取一个被持久化的对象并反序列化为对象
	 * @param fileName
	 * @param clazz
	 * @return
	 * @param <T>
	 */
	public <T> T getObject(String fileName, Class<T> clazz);

	InputStream getObjectAsInputStream(String bucketName, String objectName);

	void removeObject(String bucketName, String objectName) throws Exception;

	/**
	 * @throws Exception
	 */
	@Override
	default void afterPropertiesSet() throws Exception {
	}

}
